<?php

/**
* @desc Дополнительные параметры модуля тестов. 
* 
*/
abstract class Tests_Utils 
{
    
    /**
    * @desc Значение НЕправильного ответа.
    * 
    * @param integer
    */
    const ANSWER_WRONG = 0;
    
    /**
    * @desc Значение Правильного ответа.
    * 
    * @param integer
    */
    const ANSWER_RIGHT = 1;
    
    /**
    * @desc Название хранилища в сессии.
    * 
    * @param string
    */
    const SESSION_TITLE = 'tests';
    
    /**
    * @desc Разделитель ответов.
    * 
    * @param string
    */
    static public $_separator = "\n";
    
    /**
    * @desc Возвращает список тестов.
    * 
    * @return array
    */
    static public function getTestsList() 
    {
        $query = '
            SELECT 
                   `id`, 
                   `title` 
              FROM 
                   `tests_titles` 
          ORDER BY 
                   `title` 
               ASC 
            ';
        return database::fetchPairs($query);
    }
    
    /**
    * @desc Возвращает id активного теста.
    * 
    * @return integer
    */
    static public function getActiveTest() 
    {
        return Application::getRequest()->get('test')
            ? Application::getRequest()->get('test')
            : key(self::getTestsList());
    }
    
    /**
    * @desc Возвращает название вопроса.
    * 
    * @return string
    */
    static public function _getQuestion() 
    {
        $query = '
            SELECT 
                   `question` 
              FROM 
                   `tests_questions` 
             WHERE 
                   `id` = ' . (int)Application::getRequest()->get('id');
        return database::fetchOne($query);
    }
    
    /**
    * @desc Возвращает сессию.
    * 
    * @return mixed
    */
    static public function getSesseion() 
    {
        return isset($_SESSION[self::SESSION_TITLE][Application::getRequest()->get('session')]) 
            ? $_SESSION[self::SESSION_TITLE][Application::getRequest()->get('session')]
            : null;
    }
    
    /**
    * @desc Возвращает данные сессии.
    * 
    * @return mixed
    */
    static public function getSesseionData() 
    {
        return isset($_SESSION[self::SESSION_TITLE][Application::getRequest()->get('session')]['data']) 
            ? $_SESSION[self::SESSION_TITLE][Application::getRequest()->get('session')]['data']
            : array();
    }
    
    /**
    * @desc Записывает переданные данные в сессию.
    * 
    */
    static public function setSession($SESSION = null) 
    {
        $_SESSION[self::SESSION_TITLE][Application::getRequest()->get('session')] = $SESSION;
    }
    
    /**
    * @desc Сохраняет шаг.
    * 
    */
    static public function setSessionStep($data = null) 
    {
        $_SESSION[self::SESSION_TITLE][Application::getRequest()->get('session')]['data'][] = $data;
    }
    
    /**
    * @desc Возвращает набор ответы => вопросы по указанному набоу тестов
    * 
    * @return array
    */
    static public function getData($test_id=null) 
    {
        $SESSION = Tests_Utils::getSesseion();
        
        $test_id = is_null($test_id) 
            ? $SESSION['test_id']
            : $test_id;
        
        $query = '
            SELECT 
                   `t_q`.`id`, 
                   `t_q`.`id` AS `question_id`, 
                   `t_q`.`question` AS `question_title`, 
                   GROUP_CONCAT(`t_a`.`id` SEPARATOR "' . self::$_separator . '") AS `answer_ids`, 
                   GROUP_CONCAT(`t_a`.`answer` SEPARATOR "' . self::$_separator . '") AS `answer_titles`, 
                   GROUP_CONCAT(`t_a`.`right` SEPARATOR "' . self::$_separator . '") AS `right`
              FROM 
                   `tests_groups_collection` `t_g_c`
         LEFT JOIN 
                   `tests_questions` `t_q`
                ON 
                   `t_q`.`title_id` = `t_g_c`.`test` 
         LEFT JOIN 
                   (SELECT `id`, `answer`, `question_id`, `right` FROM `tests_answers` ORDER BY RAND()) `t_a`
                ON 
                   `t_a`.`question_id` = `t_q`.`id`
             WHERE 
                   `t_g_c`.`title_id` = ' . $test_id . '
          GROUP BY 
                   `t_q`.`id`
          ORDER BY 
                   RAND() 
        ';
        
        return database::fetchAssoc($query);
    }
    
    /**
    * @desc Преобразует строки значений разделенных "\n" в ассоциативный массив.
    * (специфично для выборки вопросов => оветов)
    * 
    * @return array
    */
    static public function explode($entries, $key_1, $key_2) 
    {
        $return = array();
        foreach ($entries as $key => $value) {
            $return[$key] = array_combine(
                explode(self::$_separator, $value[$key_1]), 
                explode(self::$_separator, $value[$key_2])
                );
        }
        return $return;
    }
    
}